package com.virtualightning.mvvm.fragments

import android.os.Bundle
import android.view.View
import androidx.annotation.CallSuper
import androidx.recyclerview.widget.RecyclerView
import com.virtualightning.mvvm.R
import com.virtualightning.mvvm.impl.adapter.IAdapterCallback
import com.virtualightning.mvvm.impl.adapter.UniverseAdapter
import com.virtualightning.mvvm.widget.SwitchView

/**
 *  Anchor : Create by CimZzz
 *  Time : 2021/1/25 18:12:16
 *  Project : zxs-new
 *  列表 Fragment
 *  内部维护了一个 RecyclerView
 */
abstract class RecyclerViewFragment : ViewStateFragment(), IAdapterCallback {
    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/9/29 5:46 PM
    // RecyclerView
    ///////////////////////////////////////////////////////////////////////////
    var recyclerView: RecyclerView? = null

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午4:44
    // 万能数据适配器
    ///////////////////////////////////////////////////////////////////////////
    protected lateinit var adapter: UniverseAdapter

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 上午10:18
    // 配置 SwitchView
    ///////////////////////////////////////////////////////////////////////////
    @CallSuper
    override fun configSwitchView(switchView: SwitchView) {
        super.configSwitchView(switchView)
        switchView.addGenerator(supportRecyclerLayout()) {
            val recyclerView = supportRecyclerView(it)
            this.recyclerView = recyclerView
            recyclerView.adapter = adapter
            configRecyclerView(recyclerView)
        }
        showLoading()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/6/7 9:28 PM
    // Adapter 初始化回调
    ///////////////////////////////////////////////////////////////////////////
    override fun initTaskAction(savedInstanceState: Bundle?) {
        super.initTaskAction(savedInstanceState)
        if(!this::adapter.isInitialized) {
            adapter = UniverseAdapter(options = getAdapterOptions().copy(
                adapterCallback = this
            ))
        }
        afterAdapterInit()
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/11/1 6:17 下午
    // 销毁 View 时取消 RecyclerView 的引用
    ///////////////////////////////////////////////////////////////////////////
    override fun onDestroyView() {
        super.onDestroyView()
        recyclerView = null
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/5 下午6:07
    // 提供带有 RecyclerView 的布局文件
    ///////////////////////////////////////////////////////////////////////////
    protected open fun supportRecyclerLayout() : Int = R.layout.view_recycler

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/2/5 下午6:08
    // 通过布局文件 Inflate 出来的 View 找到 RecyclerView
    ///////////////////////////////////////////////////////////////////////////
    protected open fun supportRecyclerView(item: View) : RecyclerView = item as RecyclerView

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午7:05
    // 显示列表内容
    ///////////////////////////////////////////////////////////////////////////
    protected open fun showContent() {
        showView(supportRecyclerLayout())
    }

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午2:30
    // 初始化适配器配置选项
    ///////////////////////////////////////////////////////////////////////////
    abstract fun getAdapterOptions(): UniverseAdapter.Options

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午5:01
    // 配置 RecyclerView
    ///////////////////////////////////////////////////////////////////////////
    open fun configRecyclerView(recyclerView: RecyclerView) {}

    ///////////////////////////////////////////////////////////////////////////
    // Add by CimZzz on 2021/1/26 下午6:40
    // 适配器初始化完成回调
    ///////////////////////////////////////////////////////////////////////////
    open fun afterAdapterInit() {}

    /**
     * 确保 Adapter 存在执行回调
     * @param callback Function1<UniverseAdapter, Unit> 回调
     */
    protected fun ensureAdapter(callback: (UniverseAdapter) -> Unit) {
        if(this::adapter.isInitialized) {
            callback(adapter)
        }
    }
}